package birdry.transition.utils
{
    import flash.display.*;
    import flash.geom.*;

    public class DistortImage extends Object
    {
        protected var _yMax:Number;
        protected var _hsLen:Number;
        protected var _sMat:Matrix;
        protected var _hseg:uint;
        protected var _vsLen:Number;
        protected var _xMin:Number;
        protected var _h:Number;
        protected var _xMax:Number;
        protected var _tri:Array;
        protected var _p:Array;
        public var smoothing:Boolean = true;
        protected var _w:Number;
        protected var _tMat:Matrix;
        protected var _vseg:uint;
        protected var _yMin:Number;

        public function DistortImage(width:Number, height:Number, vseg:uint = 2, hseg:uint = 2)
        {
            this._w = width;
            this._h = height;
            this._vseg = vseg;
            this._hseg = hseg;
            this.__init();
            return;
        }// end function

        public function setSize(param1:Number, param2:Number) : void
        {
            this._w = param1;
            this._h = param2;
            this.__init();
            return;
        }// end function

        public function get width() : Number
        {
            return this._w;
        }// end function

        protected function __init() : void
        {
            var _loc_1:Number = NaN;
            var _loc_2:Number = NaN;
            var _loc_5:Number = NaN;
            var _loc_6:Number = NaN;
            this._p = new Array();
            this._tri = new Array();
            var _loc_3:* = this._w / 2;
            var _loc_4:* = this._h / 2;
            var _loc_7:int = 0;
            this._yMin = 0;
            this._xMin = _loc_7;
            this._xMax = this._w;
            this._yMax = this._h;
            this._hsLen = this._w / (this._hseg + 1);
            this._vsLen = this._h / (this._vseg + 1);
            _loc_1 = 0;
            while (_loc_1 < this._vseg + 2)
            {
                
                _loc_2 = 0;
                while (_loc_2 < this._hseg + 2)
                {
                    
                    _loc_5 = _loc_1 * this._hsLen;
                    _loc_6 = _loc_2 * this._vsLen;
                    this._p.push({x:_loc_5, y:_loc_6, sx:_loc_5, sy:_loc_6});
                    _loc_2 = _loc_2 + 1;
                }
                _loc_1 = _loc_1 + 1;
            }
            _loc_1 = 0;
            while (_loc_1 < (this._vseg + 1))
            {
                
                _loc_2 = 0;
                while (_loc_2 < (this._hseg + 1))
                {
                    
                    this._tri.push([this._p[_loc_2 + _loc_1 * (this._hseg + 2)], this._p[_loc_2 + _loc_1 * (this._hseg + 2) + 1], this._p[_loc_2 + (_loc_1 + 1) * (this._hseg + 2)]]);
                    this._tri.push([this._p[_loc_2 + (_loc_1 + 1) * (this._hseg + 2) + 1], this._p[_loc_2 + (_loc_1 + 1) * (this._hseg + 2)], this._p[_loc_2 + _loc_1 * (this._hseg + 2) + 1]]);
                    _loc_2 = _loc_2 + 1;
                }
                _loc_1 = _loc_1 + 1;
            }
            return;
        }// end function

        public function setPrecision(param1:Number, param2:Number) : void
        {
            this._hseg = param1;
            this._vseg = param2;
            this.__init();
            return;
        }// end function

        public function setTransform(param1:Graphics, param2:BitmapData, param3:Point, param4:Point, param5:Point, param6:Point) : void
        {
            var _loc_12:Object = null;
            var _loc_13:Number = NaN;
            var _loc_14:Number = NaN;
            var _loc_15:Number = NaN;
            var _loc_16:Number = NaN;
            var _loc_7:* = param6.x - param3.x;
            var _loc_8:* = param6.y - param3.y;
            var _loc_9:* = param5.x - param4.x;
            var _loc_10:* = param5.y - param4.y;
            var _loc_11:* = this._p.length;
            while (--_loc_11 > -1)
            {
                
                _loc_12 = this._p[_loc_11];
                _loc_13 = (_loc_12.x - this._xMin) / this._w;
                _loc_14 = (_loc_12.y - this._yMin) / this._h;
                _loc_15 = param3.x + _loc_14 * _loc_7;
                _loc_16 = param3.y + _loc_14 * _loc_8;
                _loc_12.sx = _loc_15 + _loc_13 * (param4.x + _loc_14 * _loc_9 - _loc_15);
                _loc_12.sy = _loc_16 + _loc_13 * (param4.y + _loc_14 * _loc_10 - _loc_16);
            }
            this.__render(param1, param2);
            return;
        }// end function

        public function get height() : Number
        {
            return this._h;
        }// end function

        public function get vPrecision() : uint
        {
            return this._vseg;
        }// end function

        protected function __render(param1:Graphics, param2:BitmapData) : void
        {
            var _loc_3:Number = NaN;
            var _loc_4:Array = null;
            var _loc_5:Object = null;
            var _loc_6:Object = null;
            var _loc_7:Object = null;
            var _loc_8:Array = null;
            var _loc_10:Number = NaN;
            var _loc_11:Number = NaN;
            var _loc_12:Number = NaN;
            var _loc_13:Number = NaN;
            var _loc_14:Number = NaN;
            var _loc_15:Number = NaN;
            var _loc_16:Number = NaN;
            var _loc_17:Number = NaN;
            var _loc_18:Number = NaN;
            var _loc_19:Number = NaN;
            var _loc_20:Number = NaN;
            var _loc_21:Number = NaN;
            this._sMat = new Matrix();
            this._tMat = new Matrix();
            var _loc_9:* = this._tri.length;
            while (--_loc_9 > -1)
            {
                
                _loc_8 = this._tri[_loc_9];
                _loc_5 = _loc_8[0];
                _loc_6 = _loc_8[1];
                _loc_7 = _loc_8[2];
                _loc_10 = _loc_5.sx;
                _loc_11 = _loc_5.sy;
                _loc_12 = _loc_6.sx;
                _loc_13 = _loc_6.sy;
                _loc_14 = _loc_7.sx;
                _loc_15 = _loc_7.sy;
                _loc_16 = _loc_5.x;
                _loc_17 = _loc_5.y;
                _loc_18 = _loc_6.x;
                _loc_19 = _loc_6.y;
                _loc_20 = _loc_7.x;
                _loc_21 = _loc_7.y;
                this._tMat.tx = _loc_16;
                this._tMat.ty = _loc_17;
                this._tMat.a = (_loc_18 - _loc_16) / this._w;
                this._tMat.b = (_loc_19 - _loc_17) / this._w;
                this._tMat.c = (_loc_20 - _loc_16) / this._h;
                this._tMat.d = (_loc_21 - _loc_17) / this._h;
                this._sMat.a = (_loc_12 - _loc_10) / this._w;
                this._sMat.b = (_loc_13 - _loc_11) / this._w;
                this._sMat.c = (_loc_14 - _loc_10) / this._h;
                this._sMat.d = (_loc_15 - _loc_11) / this._h;
                this._sMat.tx = _loc_10;
                this._sMat.ty = _loc_11;
                this._tMat.invert();
                this._tMat.concat(this._sMat);
                param1.beginBitmapFill(param2, this._tMat, false, this.smoothing);
                param1.moveTo(_loc_10, _loc_11);
                param1.lineTo(_loc_12, _loc_13);
                param1.lineTo(_loc_14, _loc_15);
                param1.endFill();
            }
            return;
        }// end function

        public function get hPrecision() : uint
        {
            return this._hseg;
        }// end function

    }
}
